Dans cette partie du cours vous allez apprendre à restructurer des tables dans R. Ces changement sont parfois nécessaire pour mettre les données dans le format adapté au graphique que vous voulez réaliser.
Aujourd’hui nous allons voir comment:
Ajouter ou modifier des colonnes
Reformater des données
Ordonner un tableau en utilisant les valeurs d’une colonne
Combiner plusieurs tableaux en un seul
Tout d’abord, créez un nouveau script R et préparez votre environnement de travail:
# Chargez la librairie `tidyverse`
# Changez votre répertoire de travail pour être dans `session3_plots_reorganisation`
# Importer `burghardt_et_al_2015_expt1.txt` et mettez le dans un objet appelé `expt1`
mutate()La fonction mutate() permet d’ajouter de nouvelles variables (i.e. nouvelles colonnes) dans une table, ou de modifier des colonnes déjà existantes.
Par exemple, ajoutons une colonne leaf.length.cm qui va contenir la longueur des feuilles en cm. Pour cela nous devons créer une nouvelle colonne en utilisant la colonne leaf.length.mm qui existe dans la table.
# Créez une nouvelle table avec la colonne supplémentare
expt1.cm <- mutate(expt1, total.leaf.length.cm = total.leaf.length.mm/10)
# Vérifier que la nouvelle colonne est bien là
colnames(expt1.cm)
## [1] "plant_nb" "genotype" "background"
## [4] "temperature" "fluctuation" "day.length"
## [7] "vernalization" "survival.bolt" "bolt"
## [10] "days.to.bolt" "days.to.flower" "rosette.leaf.num"
## [13] "cauline.leaf.num" "blade.length.mm" "total.leaf.length.mm"
## [16] "total.leaf.length.cm"
Nous pouvons aussi créer et modifier plus d’une colonne à la fois, en les séparant pas une virgule (,) dans la fonction mutate():
# Créez deux nouvelles colonnes
expt1.cm <- mutate(expt1,
blade.length.cm = blade.length.mm/10,
total.leaf.length.cm = total.leaf.length.mm/10)
# Vérifier que les nouvelles colonnes sont bien là
colnames(expt1.cm)
## [1] "plant_nb" "genotype" "background"
## [4] "temperature" "fluctuation" "day.length"
## [7] "vernalization" "survival.bolt" "bolt"
## [10] "days.to.bolt" "days.to.flower" "rosette.leaf.num"
## [13] "cauline.leaf.num" "blade.length.mm" "total.leaf.length.mm"
## [16] "blade.length.cm" "total.leaf.length.cm"
Attention!! Si vous utilisez le nom d’une colonne déjà existante, vous allez la modifier et non créer une nouvelle colonne.
unite() et separate()Pour concaténer deux ou plusieurs colonnes ensemble, utilisez la fonction unite(). Par exemple, pour concaténer vernalization, survival.bolt et bolt:
# Créez deux nouvelles colonnes
expt1.concatenated <- unite(expt1, "Vern_survival_bolt",vernalization,survival.bolt,bolt)
# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.concatenated)
## [1] "plant_nb" "genotype" "background"
## [4] "temperature" "fluctuation" "day.length"
## [7] "Vern_survival_bolt" "days.to.bolt" "days.to.flower"
## [10] "rosette.leaf.num" "cauline.leaf.num" "blade.length.mm"
## [13] "total.leaf.length.mm"
A contrario, pour séparer une colonne en deux ou plusieurs colonnes, utilisez la fonction separate(). Par exemple, pour séparer la colonne barkground :
# Créez deux nouvelles colonnes
expt1.separated <- separate(expt1, background, into=c("genotype", "FRI mutation"))
# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.separated)
## [1] "plant_nb" "temperature" "genotype"
## [4] "FRI mutation" "fluctuation" "day.length"
## [7] "vernalization" "survival.bolt" "bolt"
## [10] "days.to.bolt" "days.to.flower" "rosette.leaf.num"
## [13] "cauline.leaf.num" "blade.length.mm" "total.leaf.length.mm"
Exercice:
Reproduisez cette figure de Burghard et al 2015
Aide:
Créez une nouvelle colonne avec le ratio de
blade.length.mmettotal.leaf.length.mmCréez une nouvelle colonne (nommée par exemple
condition) en concaténantday.length,temperatureetfluctuationSélectionnez les background
ColetLerFaites un boxplot du ratio de
blade.length.mmettotal.leaf.length.mmen fonction de lacondition, en créant des facets en fonction du backgroundPas besoin de mettre de la couleur qui n’apporte rien au graphique
spread() et gather()Parfois, le format de vos données ne vous permet pas de faire l’analyse ou le graphique que vous voulez.
Par exemple, essayons de reproduire le graphique suivant extrait de Burghard et al 2015
Pour faire cette figure il nous faut une colonne avec le temps de floraison pour les plantes en conditions constante et une autre colonne avec le temps de floraison pour les plantes en condition variable. Le temps de floraison pour toutes les plantes sont dans la même colonne dans notre tableau. Par contre, l’information sur le type de traitement (variable ou constant) est dans une autre colonne. Ce n’est pas ce que nous voulons! Heureusement, nous pouvons utiliser la fonction spread() pour reformater notre tableau.
Pour y voir plus clair, ne gardons que les colonnes qui vont nous être utile à la création du tableau:
expt1_subset <- select(expt1, plant_nb:vernalization, days.to.bolt)
Maintenant nous devons changer la structure de la table pour avoir une colonne avec le temps de floraison pour les plantes en conditions constante et une autre colonne avec le temps de floraison pour les plantes en condition variable. Un peu comme dans le schéma ci-dessous (pour aller du format “long” au format “wide”).
La fonction spread() a besoin de deux informations:
Le nom de la colonne qui va permettre de créer les noms de colonnes dans la nouvelle table. Dans notre cas fluctuation
Le nom de la colonne qui contient les valeurs qui vont remplir les nouvelles colonnes. Dans notre cas days.to.bolt
Voici comment restructurer notre tableau avec spread():
expt1_wide <- spread(expt1_subset, key=fluctuation, value = days.to.bolt)
Afin de pouvoir reproduire les couleurs du graphique, nous devons concaténer les colonnes temperature et day.length. Et nous pouvons enfin faire le graphique:
unite(expt1_wide, "treatment", temperature, day.length) %>%
ggplot(aes(x=Con, y=Var, color=treatment)) +
geom_point()
## Warning: Removed 51 rows containing missing values (geom_point).
Comme vous avez vu, changer la structure du tableau nous a permis de faire un graphique que nous n’aurions pas pu faire autrement. Cela peut aussi permettre de faire des analyses supplémentaires.
A l’inverse la fonction gather() permet de passer d’un format “wide” à un format “long”.
Dans ce cas, le nom des colonnes sélectionnées devient la “clé”, c’est à dire les catégories dans la première colonne crée (en violet dans l’illustration). Et les valeurs de toutes ces colonnes sélectionnées vont remplir la deuxième colonne crée (en bleu dans l’illustration).
Imaginons que nous souhaitons faire un boxplot pour le days.to.bolt et le days.to.flower. Il nous faut réorganiser le tableau pour avoir les données pour ces deux mesures dans la même colonnes (trait) et une colonne indiquant s’il s’agit de la mesure de days.to.bolt ou days.to.flower (time.in.days).
gather() à besoin de trois informations:
le nom de la nouvelle colonne contenant les nom des vieilles colonnes (dans notre cas trait)
le nom de la nouvelle colonne contenant les valeurs des anciennes colonnes (dans notre cas time.in.days)
le nom des anciennes colonnes que l’ont veut rassembler
Voici comment restructurer notre tableau avec gather():
expt1_long <- gather(expt1, "trait", "time.in.days", days.to.bolt, days.to.flower)
Nous pouvons maintenant faire notre boxplot
ggplot(expt1_long, aes(x=trait, y=time.in.days, color=genotype)) +
geom_boxplot()
## Warning: Removed 83 rows containing non-finite values (stat_boxplot).
Exercice:
Utilisez la fonction
gather()pour restructurer le tableau afin de faire un boxplot deblade.length.mmettotal.leaf.length.mm, coloré par la température
Parfois, nous voulons ordonnées nos données en fonction des valeurs d’une colonne.
Pour cela, nous pouvons utiliser la fonction arrange():
arrange(expt1, days.to.flower)
## # A tibble: 957 x 15
## plant_nb genotype background temperature fluctuation day.length vernalization
## <dbl> <chr> <chr> <dbl> <chr> <dbl> <chr>
## 1 5 Col Ama Col 22 Con 16 V
## 2 1 flc-3 F… Col FRI 22 Con 16 V
## 3 1 Col Ama Col 22 Con 16 V
## 4 3 Col Ama Col 22 Con 16 V
## 5 4 Col Ama Col 22 Con 16 V
## 6 2 flc-3 F… Col FRI 22 Con 16 V
## 7 3 flc-3 F… Col FRI 22 Con 16 V
## 8 7 flc-3 F… Col FRI 22 Con 16 V
## 9 3 flc-3 F… Col FRI 22 Var 16 V
## 10 5 flc-3 F… Col FRI 22 Var 16 V
## # … with 947 more rows, and 8 more variables: survival.bolt <chr>, bolt <chr>,
## # days.to.bolt <dbl>, days.to.flower <dbl>, rosette.leaf.num <dbl>,
## # cauline.leaf.num <dbl>, blade.length.mm <dbl>, total.leaf.length.mm <dbl>
Par défaut, les valeurs sont ordonnées de la plus basse à la plus haute.
Pour ordonner les valeurs de la plus haute à la plus basse, nous devons le spécifier en utilisant desc():
arrange(expt1, desc(days.to.flower))
## # A tibble: 957 x 15
## plant_nb genotype background temperature fluctuation day.length vernalization
## <dbl> <chr> <chr> <dbl> <chr> <dbl> <chr>
## 1 7 vin3-4 … Col FRI 12 Con 8 NV
## 2 8 vin3-4 … Col FRI 12 Con 8 NV
## 3 4 vin3-4 … Col FRI 12 Con 8 NV
## 4 8 vin3-4 … Col FRI 12 Var 8 NV
## 5 7 vin3-4 … Col FRI 12 Con 8 V
## 6 5 vin3-4 … Col FRI 12 Con 8 NV
## 7 1 vin3-4 … Col FRI 22 Con 8 V
## 8 2 ld-1 Col 22 Con 8 NV
## 9 7 vin3-4 … Col FRI 12 Var 8 NV
## 10 8 vin3-4 … Col FRI 12 Con 8 V
## # … with 947 more rows, and 8 more variables: survival.bolt <chr>, bolt <chr>,
## # days.to.bolt <dbl>, days.to.flower <dbl>, rosette.leaf.num <dbl>,
## # cauline.leaf.num <dbl>, blade.length.mm <dbl>, total.leaf.length.mm <dbl>
*_join())